<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <script>
            function fn() {
                /* 
                    arguments
                        - arguments是函数中又一个隐含参数
                        - arguments是一个类数组对象（伪数组）
                            和数组相似，可以通过索引来读取元素，也可以通过for循环变量，但是它不是一个数组对象，不能调用数组的方法
                        - arguments用来存储函数的实参，
                            无论用户是否定义形参，实参都会存储到arguments对象中
                            可以通过该对象直接访问实参
                */

                // console.log(arguments[2])
                // console.log(Array.isArray(arguments))
                // for (let i = 0; i < arguments.length; i++) {
                //     console.log(arguments[i])
                // }

                // for(let v of arguments){
                //     console.log(v)
                // }

                arguments.forEach((ele) => console.log(ele))
            }

            // fn(1, 10, 33)

            // 定义一个函数，可以求任意个数值的和
            function sum() {
                // 通过arguments，可以不受参数数量的限制更加灵活的创建函数
                let result = 0

                for (let num of arguments) {
                    result += num
                }

                return result
            }

            /* 
                可变参数，在定义函数时可以将参数指定为可变参数
                    - 可变参数可以接收任意数量实参，并将他们统一存储到一个数组中返回
                    - 可变参数的作用和arguments基本是一致，但是也具有一些不同点：
                        1. 可变参数的名字可以自己指定
                        2. 可变参数就是一个数组，可以直接使用数组的方法
                        3. 可变参数可以配合其他参数一起使用
            */

            function fn2(...abc) {
                console.log(abc)
            }

            function sum2(...num) {
                return num.reduce((a, b) => a + b, 0)
            }

            // 当可变参数和普通参数一起使用时，需要将可变参数写到最后
            function fn3(a, b, ...args) {
                // for (let v of arguments) {
                //     console.log(v)
                // }

                console.log(args)
            }

            fn3(123, 456, "hello", true, "1111")
        </script>
    </head>
    <body></body>
</html>
